
#ifndef TASK_H
#define TASK_H

/* Proceso būsenos */
#define READY		1				/* Pasiruošęs */
#define WAIT		2				/* Laukiantis I/O */
#define ZOMBIE	3				/* Miręs procesas */

/* Proceso prioritetai */
#define KERNEL_MODE	1
#define USER_MODE		2

/* Proceso aprašas */
typedef struct task {
	int 		id;							/* Proceso ID */
	char 		name[64];				/* Proceso pavadinimas */
	int 		state;					/* Proceso būsena */
	int			priority;				/* Proceso prioritetas */
	u32int	console;				/* Konsolės numeris */
	u32int	esp0;						/* Naudojamo steko pointeris (kernel mode) */
	u32int	esp3;						/* Naudojamo steko pointeris (user mode) */
	struct task 	*father;	/* Proceso tėvas (iniciatorius) */
	struct task		*next;		/* Kitas procesas eilėje */
	struct task		*prev;		/* Ankstesnis procesas eilėje */
	struct child	*childs;	/* Proceso vaikai */
} task_t;

/* Vaikų aprašas */
typedef struct child {
	task_t *childr;
	struct child *next;
} child_t;

void init_multitasking();									/* Multitaskingo iniciavimas */
task_t* create_task(void (*thread)(), char name[64], int priority, u32int );	/* Proceso sukūrimas */
u32int task_switch(u32int old_esp); 			/* Eilių valdymas */

int new_id();															/* Pateikia naują id procesui */
task_t* current_task();										/* Pateikia einamąjį procesą */
void add_child(task_t *child);

void suspend_task(task_t *);
void resume_task(task_t *);
void finish_task();		/* Procesas pats baigia darbą */
void kill_childs(task_t *task);
void remove_father(task_t *task);
void kill(int id);		/* Procesas priverstinai baigia darbą */
int find_task(int id);
#endif
